/******************************************************************************/
/* Fichero:     Amigos.java
/* Versión:     1.0
/* Autor:       Luis Maqueda
/* Fecha:       Mayo 2009
/* Proyecto:    AELANsoft cumpleaños
/* Descripción: Hereda de la clase VectorPersonas.
/******************************************************************************/
package utiles;

import java.util.GregorianCalendar;

/******************************************************************************/
public class Amigos extends VectorPersonas {
/******************************************************************************/

   /***************************************************************************
    * Constructor de clase.
    * Pre: Se ha invocado al método ListaAmigos() del Cliente.
    * Post: crea el vector de amigos del usuario cuyo correo es “correo”. El
    * vector de amigos, se pasa como parámetro.
    * @param amigos vector de personas resultado de buscar a los amigos de un
    * usuario dado
    **************************************************************************/
   public Amigos(VectorPersonas amigos) {
      // Llamamos al constructor del padre
      super();

      // Almacenamos la lista de amigos
      if (amigos.size() > 0) {
         this.clear();
         for (int i = 0; i < amigos.size(); i++) {
            this.add(amigos.elementAt(i));
         }
         // Ordenamos la lista de amigos
         OrdenarAmigos(0, amigos.size()-1);
      }
   }

   /***************************************************************************
    * Post: El vector de personas de amigos se ordena utilizando el algoritmo
    * QuickSort
    * @param primero Indice del primer elemento del vector
    * @param ultimo Indice del ultimo elemento del vector
    **************************************************************************/
   private void OrdenarAmigos(int primero, int ultimo) {
      // Variables
      int i, j;
      Persona pivote;
      Persona auxiliar;

      i = primero;
      j = ultimo;
      pivote = (Persona)this.elementAt((primero + ultimo) / 2);
      do {
         while (((Persona) (this.elementAt(i))).compararCumple(pivote) < 0) {
            i++;
         }
         while (((Persona) (this.elementAt(j))).compararCumple(pivote) > 0) {
            j--;
         }
         if (i <= j) {
            auxiliar = (Persona) this.elementAt(j);
            this.setElementAt(this.elementAt(i), j);
            this.setElementAt(auxiliar, i);
            i++;
            j--;
         }
      } while (i <= j);
      if (primero < j) {
         OrdenarAmigos(primero, j);
      }
      if (ultimo > i) {
         OrdenarAmigos(i, ultimo);
      }
   }

   /***************************************************************************
    * Pre: Se ha invocado al método eliminaUnResultado() de Búsqueda
    * Post: Actualiza la lista de amigos del usuario cuyo correo es "correo"
    * añadiendo aquel amigo que ha sido eliminado de la búsqueda.
    * @param unAmigo amigo a añadir a la lista de amigos del usuario
    **************************************************************************/
   public void ActualizarAmigos(Persona unAmigo) {
      this.add(unAmigo);
      OrdenarAmigos(0, this.size()-1);
   }

   /***************************************************************************
    * Pre: Se ha realizado la llamada a ListarAmigos() de Cliente
    * Post: Devuelve un vector con las personas que cumplen años hoy. Como
    * fecha de hoy se toma la fecha del sistema.
    * @return aux vector con las personas que cumplen años hoy
    **************************************************************************/
   public VectorPersonas CumpleanosHoy() {
      // Variables
      VectorPersonas aux = new VectorPersonas();

      // Recuperamos la fecha actual
      GregorianCalendar fechaHoy = new GregorianCalendar();

      // Creamos una persona ficticia con quien comparar los demas cumpleaños
      Persona dummy = new Persona();
      dummy.diaCumple = fechaHoy.get(GregorianCalendar.DAY_OF_MONTH);
      dummy.mesCumple = fechaHoy.get(GregorianCalendar.MONTH) + 1;
      // mientras la fecha de hoy sea mayor o igual que las del vector, es
      // decir, mientras las fechas del vector sean menores o iguales que la
      // fecha de hoy
      if (this.size() > 0) {
         for (int i = 0; i < this.size() &&
               dummy.compararCumple((Persona) this.elementAt(i)) >= 0; i++) {
            if (dummy.compararCumple((Persona) this.elementAt(i)) == 0) {
               aux.add(this.elementAt(i));
            }
         }
      }
      return aux;
   }
}
